

/*
client em java utilizando socket e implementado atravez da interface objetoDistribuido
*/

import java.net.*;
import java.io.*;
import java.util.*;
import tools.command.*;
import tools.invoker.*;
import tools.ObjetoDistribuido.*;
import tools.command.commandInterface.*;

public class ServerDistributed extends ObjetoDistribuido { 
	

	//Declarações inicias
	private static ServerSocket socket1;
	private static int port;
	private static Socket connection;
	private static StringBuffer msg;
	private static String TimeStamp, returnCode;
	private static int nMsg;
	private static String tipo;
	private static int letra;
	private static ServerDistributed obj;
	private static CommandGetTipo cmd;
	private static CommandChangePort cmd2;
	private static Invoker invoker;



	/*--------------------------------------*/
	/*					*/
	/*	Implementação da interface 	*/
	/*	    Objeto distribuido		*/
	/*					*/
	/*--------------------------------------*/

	//implementação usage da interface
	public void usage(){
		System.out.println("Usage: \n $java serverDistributed port");
		System.out.println("\t port: \t\t Porto a ser utilizado");
	}

	//pergunta qual a porta que deve ser escutada
	public int getPort(){
		return this.port;
	}	

	//seta qual porta deve ser escutada
	public void setPort(int port){
		this.port = port;
	}


	//implementação setTipo da interface
	public 	void setTipo(String tipo){

		this.tipo = tipo;	
		
	}
	//implementação getTipo da interface
	public String getTipo(){

		return this.tipo;
		
	}

	//implementação de fechamento da conexao 
	public	void fecha(){
		try{
			this.connection.close();
		}
		catch( IOException e){
			
			System.out.println("Não consegui fechar a conexão");
		}
	}


	//implementação da função de escrita no canal
	public	void escreve(String msg){
		
		
		//monta uma resposta
	        returnCode = "\"" + msg + "\":" + " Esta foi a " + getNMsg() + " msg recebida pelo servidor ate agora (" + getTime() + ")" + (char) '&';

		invoker.escreve(returnCode);
	}
	

	//implementação da função de leitura do canal
	public void recebe(){
			
			while(true){
			
				//aguarda a proxima requisicao
				invoker.serverProximo();
	
				//Conta a msg recebida
				this.nMsg = this.nMsg + 1;

				invoker.recebe();	
				//envia resposta
				this.obj.escreve( invoker.getMsg());

			}


	}


	/*--------------------------------------*/
	/*					*/
	/*	     Funções próprias		*/
	/*					*/
	/*--------------------------------------*/

	//Construtor 
	public ServerDistributed(int porta){
		this.nMsg=0;
		setPort(porta);
		setTipo("server");
		
	}
	public ServerDistributed(){
		this.nMsg=0;
		setPort(2222);
		setTipo("server");
		
	}



	//retorna o numero de mensagens recebidas
	public int getNMsg(){
		return this.nMsg;
	}

	//pergunta sobre o tempo
	public String getTime(){
		TimeStamp = new java.util.Date().toString();

		return TimeStamp;
	}
	

	/* Função principal */
	public static void main(String[] args){

		 //verifica se o numero de parametros esta correto
		 if ( args.length != 1){
			obj = new ServerDistributed();
			obj.usage();	
		}
		else{

			
			//Instancia o invoker
			invoker = new Invoker("localhost", Integer.parseInt(args[0]));
			System.out.println("Servidor Iniciado na porta " + Integer.parseInt(args[0])); 

			//inicia connection invoker
			invoker.openConnectionServer();

			obj = new ServerDistributed(Integer.parseInt(args[0]));

			obj.recebe();

			//fecha connection
			invoker.closeConnection();
		}
	}
}

